﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Ajax;
using System.Runtime.ExceptionServices;
using MvcApplication1.Models;

namespace MvcApplication1.Controllers
{
    public class EquiposController : Controller
    {
        IRepositorioEquipo repositorioEquipo;
        IRepositorioJugador repositorioJugador;
        IRepositorioLiga repositorioLiga;
        IRepositorioUsuario1 repositorioUsuario;

        public EquiposController()
            : this(new RepositorioEquipo(), new RepositorioJugador())
        {
            repositorioLiga = new RepositorioLiga();
            repositorioUsuario = new RepositorioUsuario();
        }

        public EquiposController(IRepositorioEquipo repoEquipo, IRepositorioJugador repoJugador)
        {
            repositorioEquipo = repoEquipo;
            repositorioJugador = repoJugador;
        }

        //
        // GET: /Equipos/

        public ActionResult Index()
        {

            HttpCookie cookie = HttpContext.Request.Cookies["IdLiga"];
            Liga ligaActual = repositorioLiga.getLiga(Convert.ToInt32(cookie.Value));
            ViewData["Liga"] = ligaActual.Nombre;
            //!!Verificar antes y etc...
            List<Equipo> equipos = ligaActual.Equipos.ToList();
            ViewData["inicializado"] = ligaActual.Inicalizada ? "true" : "false";

            Usuario usuarioActual = repositorioUsuario.EncontrarUsuarioNombre(User.Identity.Name);
            ViewData["Usuario"] = "";
            if (usuarioActual != null)
                ViewData["Usuario"] = usuarioActual.TipoDeUsuario.TipoDeUsuario1;

            ViewData["Ligas"] = new SelectList(repositorioLiga.EncontrarTodasLasLigas().ToList());
            return View("Index", equipos);
        }

        //
        // GET: /Equipos/Details/5

        public ActionResult Details(int id)
        {
            
            HttpCookie cookie = HttpContext.Request.Cookies["IdLiga"];
            //!!Verificar antes y etc...
            Liga ligaActual = repositorioLiga.getLiga(Convert.ToInt32(cookie.Value));
            ViewData["Empezado"] = ligaActual.Inicalizada.ToString();
            Usuario usuarioActual = repositorioUsuario.EncontrarUsuarioNombre(User.Identity.Name);
            ViewData["Usuario"] = "";
            if (usuarioActual != null)
                ViewData["Usuario"] = usuarioActual.TipoDeUsuario.TipoDeUsuario1;

            Equipo equipo = repositorioEquipo.getEquipo(id);
            List<Jugadore> aux = new List<Jugadore>();
            if (repositorioEquipo.getEquipo(id).IDCapitan != null)
            {
                ViewData["Capitan"] = repositorioJugador.GetJugador((int)repositorioEquipo.getEquipo(id).IDCapitan).Nombre + " " + repositorioJugador.GetJugador((int)repositorioEquipo.getEquipo(id).IDCapitan).Apellido;
            }
            else
            {
                ViewData["Capitan"] = "No Asignado";
            }
            
            ViewData["Jugadores"] = equipo.Jugadores.ToList();

            if (equipo == null)
                return View("NotFound");
            else
                return View("Details", equipo);

        }

        //
        // GET: /Equipos/Create

        public ActionResult Create()
        {
            Equipo e = new Equipo();

            ViewData["Ligas"] = new SelectList(repositorioLiga.EncontrarTodasLasLigas().ToList());
            HttpCookie cookie = HttpContext.Request.Cookies["IdLiga"];

            Liga ligaActual = repositorioLiga.getLiga(Convert.ToInt32(cookie.Value));
            ViewData["Liga"] = ligaActual.Nombre;
            return View(e);
        }

        //
        // POST: /Equipos/Create

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Create(FormCollection collection)
        {
            ViewData["Ligas"] = new SelectList(repositorioLiga.EncontrarTodasLasLigas().ToList());
            HttpCookie cookie = HttpContext.Request.Cookies["IdLiga"];

            Liga ligaActual = repositorioLiga.getLiga(Convert.ToInt32(cookie.Value));
            ViewData["Liga"] = ligaActual.Nombre;
            Equipo eq = new Equipo();
            try
            {
                string ola = Request.Form["lbJugadores"];

                eq.Nombre = Request.Form["Nombre del equipo:"];
                eq.IDLiga = ligaActual.IDLiga;
                eq.Puntos = 0;
                eq.EstadoPagos = "Al Dia";
                if (eq.EsValido)
                {
                    repositorioEquipo.AgregarEquipo(eq);
                    repositorioEquipo.Save();

                    string capitant = collection["ctl00$MainContent$Apellido"];
                    string jugadortext = collection["ctl00$MainContent$Nombre"].ToString();

                    List<string> jugadores = new List<string>();

                    while (jugadortext != "")
                    {
                        if (jugadortext.IndexOf("-") != -1)
                        {
                            string temp = jugadortext.Substring(0, jugadortext.IndexOf("-") - 1);
                            jugadortext = jugadortext.Substring(jugadortext.IndexOf("-") + 2);
                            if (temp != capitant)
                                jugadores.Add(temp);
                        }
                        else
                        {
                            if (jugadortext != capitant)
                                jugadores.Add(jugadortext);
                            break;
                        }
                    }

                    List<Jugadore> jug = new List<Jugadore>();


                    //añado el capitan
                    Jugadore capitan = new Jugadore();
                    capitan.Nombre = capitant.Substring(0, capitant.IndexOf(" "));
                    capitan.Apellido = capitant.Substring(capitant.IndexOf(" ") + 1); ;
                    capitan.EMail = Request.Form["EMail:"];
                    capitan.IDEquipo = eq.IDEquipo;
                    capitan.GolesAcumulados = 0;
                    capitan.Posicion = "no asignada";
                    jug.Add(capitan);
                    repositorioJugador.AgregarJugador(capitan);
                    repositorioJugador.Save();
                    eq.IDCapitan = capitan.IDJugador;
                    repositorioEquipo.Save();

                    //añado el resto de los jugadores
                    foreach (string nombre in jugadores)
                    {
                        Jugadore temp = new Jugadore();
                        temp.Nombre = nombre.Substring(0, nombre.IndexOf(" "));
                        temp.Apellido = nombre.Substring(nombre.IndexOf(" ") + 1);
                        temp.IDEquipo = eq.IDEquipo;
                        temp.EMail = Request.Form["EMail:"];
                        temp.Posicion = "no asignada";
                        temp.GolesAcumulados = 0;
                        jug.Add(temp);
                        repositorioJugador.AgregarJugador(temp);
                        repositorioJugador.Save();
                    }
                    repositorioEquipo.Save();

                    return RedirectToAction("Details", new { id = eq.IDEquipo });
                }
            }
            catch (Exception e)
            {

            }
            return View();
        }

        //
        // GET: /Equipos/Edit/5

        public ActionResult Edit(int id)
        {
            Usuario usuarioActual = repositorioUsuario.EncontrarUsuarioNombre(User.Identity.Name);
            ViewData["Usuario"] = "";
            if (usuarioActual != null)
            {
                if (!usuarioActual.TipoDeUsuario.TipoDeUsuario1.Equals("admin"))
                    return View("NoPermiso");
            }
            else
            {
                return View("NoPermiso");
            }
                
            ViewData["Ligas"] = new SelectList(repositorioLiga.EncontrarTodasLasLigas().ToList());
            Equipo equipo = repositorioEquipo.getEquipo(id);
            ViewData["Jugadores"] = equipo.Jugadores.ToList();


            return View(equipo);
        }

        //
        // POST: /Equipos/Edit/5

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Edit(int id, FormCollection collection)
        {

            ViewData["Ligas"] = new SelectList(repositorioLiga.EncontrarTodasLasLigas().ToList());
            
            Equipo eq = repositorioEquipo.getEquipo(id);
            ViewData["Jugadores"] = eq.Jugadores.ToList();
            try
            {
                eq.Nombre = Request.Form["Nombre del equipo:"];
                eq.EstadoPagos = Request.Form["EstadoPagos"];

                if (eq.EsValido)
                {
                    repositorioEquipo.Save();

                    string capitant = collection["ctl00$MainContent$Apellido"];
                    string jugadortext = collection["ctl00$MainContent$Nombre"].ToString();

                    List<string> jugadores = new List<string>();

                    while (jugadortext != "")
                    {
                        if (jugadortext.IndexOf("-") != -1)
                        {
                            string temp = jugadortext.Substring(0, jugadortext.IndexOf("-") - 1);
                            jugadores.Add(jugadortext.Substring(0, jugadortext.IndexOf("-") - 1));
                            jugadortext = jugadortext.Substring(jugadortext.IndexOf("-") + 1);
                        }
                        else
                        {
                            if (jugadortext != capitant)
                                jugadores.Add(jugadortext);
                            break;
                        }
                    }



                    List<Jugadore> jug = new List<Jugadore>();
                    List<Jugadore> jugadoresiniciales = eq.Jugadores.ToList();

                    //REVISAMOS QUE NO SE REPITAN JUGADORES PRIMERO
                    //REVISAMOS CUALES TENEMOS QUE BORRAR TAMBIEN

                    for (int i = 0; i < jugadores.Count; i++)
                    {
                        string nombre = jugadores[i];
                        Jugadore temp = new Jugadore();
                        if (nombre.IndexOf(" ") == 0)
                        {
                            nombre = nombre.Substring(1);
                        }
                        if (nombre.LastIndexOf(" ") == nombre.Length - 1)
                        {
                            nombre = nombre.Substring(0, nombre.Length - 1);
                        }

                        temp.Nombre = nombre.Substring(0, nombre.IndexOf(" "));
                        temp.Apellido = nombre.Substring(nombre.IndexOf(" ") + 1);
                        temp.IDEquipo = eq.IDEquipo;
                        temp.EMail = Request.Form["EMail:"];
                        temp.Posicion = "no asignada";
                        temp.GolesAcumulados = 0;
                        jug.Add(temp);
                    }

                    for(int i = 0; i < jug.Count;i++)
                    {
                        Jugadore nuevo = jug[i];
                        bool agregar = true;
                        for(int j = 0; j<jugadoresiniciales.Count; j++)
                        {
                            Jugadore viejo = jugadoresiniciales[j];
                            if (nuevo.Nombre == viejo.Nombre && nuevo.Apellido == viejo.Apellido)
                            {
                                i--;
                                if (nuevo.Nombre + " " + nuevo.Apellido == capitant)
                                {
                                    eq.IDCapitan = viejo.IDJugador;
                                    repositorioEquipo.Save();
                                }
                                jugadoresiniciales.Remove(viejo);
                                jug.Remove(nuevo);
                                agregar = false;
                                break;
                            }
                        }

                        if (agregar)
                        {
                            repositorioJugador.AgregarJugador(nuevo);
                            repositorioJugador.Save();
                            if (capitant == nuevo.Nombre + " " + nuevo.Apellido)
                            {
                                eq.IDCapitan = nuevo.IDJugador;
                                repositorioEquipo.Save();
                            }
                        }
                    }

                    foreach (Jugadore j in jugadoresiniciales)
                    {
                        Jugadore jugador = repositorioJugador.GetJugador(j.IDJugador);
                        repositorioJugador.EliminarJugador(jugador);
                    }
                    repositorioJugador.Save();

                    repositorioEquipo.Save();

                    return RedirectToAction("Index");
                }
            }
            catch(Exception e)
            {
                return View(eq);
            }
            return View(eq);
        }

        public ActionResult Delete(int id)
        {
            Usuario usuarioActual = repositorioUsuario.EncontrarUsuarioNombre(User.Identity.Name);
            if (usuarioActual != null)
            {
                if (!usuarioActual.TipoDeUsuario.TipoDeUsuario1.Equals("admin"))
                    return View("NoPermiso");
            }
            else
            {
                return View("NoPermiso");
            }

            HttpCookie cookie = HttpContext.Request.Cookies["IdLiga"];
            //!!Verificar antes y etc...
            Liga ligaActual = repositorioLiga.getLiga(Convert.ToInt32(cookie.Value));

            if (ligaActual.Inicalizada == true)
            {
                return View("Inicializada");
            }

            Equipo eq = repositorioEquipo.getEquipo(id);
            if (eq == null)
                return View("NotFound");
            else
                return View(eq);
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Delete(int id, string confirmButton)
        {
            Equipo eq = repositorioEquipo.getEquipo(id);
            if (eq == null)
                return View("NotFound");
            eq.IDCapitan = null;
            repositorioEquipo.Save();
            int ciclos = eq.Jugadores.Count;
            for (int i = 0; i < ciclos; i++)
            {
                Jugadore aux = repositorioJugador.GetJugador(eq.Jugadores[i].IDJugador);
                repositorioJugador.EliminarJugador(aux);
            }
            repositorioJugador.Save();
            eq = repositorioEquipo.getEquipo(id);
            repositorioEquipo.EliminarEquipo(eq);
            repositorioEquipo.Save();
            return View("Deleted");
        }

    }
}
